; low-level routines for PGP (file handling etc)
;

r0 RN 0
r1 RN 1
r2 RN 2
r3 RN 3
r4 RN 4
r5 RN 5
sp RN 13
lr RN 14
pc RN 15

XOS_Bit		EQU &20000
SWI_OS_WriteC	EQU &00000
SWI_OS_ReadC	EQU &00004
SWI_OS_Byte	EQU &00006
SWI_OS_File	EQU &00008
SWI_OS_Args	EQU &00009
SWI_OS_GBPB	EQU &0000C
SWI_OS_EnterOS	EQU &00016
SWI_OS_Hardware EQU &7a

	AREA |A$$Code|, CODE, READONLY

	EXPORT access
	EXPORT strlwr
	EXPORT read
	EXPORT getch
	EXPORT fileno
	EXPORT lseek
	EXPORT write
	EXPORT ro_flush_input
	EXPORT ioc_t1
	EXPORT putch

fileno	LDR r0,[r0,#20] ; This is supposed to be the RISC OS file handle
	MOV pc,lr       ; (member '__file' of Acorn's FILE structure) */

strlwr	LDRB r1,[r0],#1
	CMP r1,#0
	MOVEQ pc,lr
	SUB r2,r1,#97
	CMP r2,#26
	ORRLO r1,r1,#32
	STRLOB r1,[r0,#-1]
	B strlwr

read	STMFD sp!,{r4,r5,lr}
	MOV r5,r1
	MOV r3,r2
	MOV r2,r1
	MOV r1,r0
	MOV r0,#4
	SWI XOS_Bit+SWI_OS_GBPB
	SUB r0,r2,r5
	LDMFD sp!,{r4,r5,pc}

write	STMFD sp!,{r4,r5,lr}
	MOV r5,r1
	MOV r3,r2
	MOV r2,r1
	MOV r1,r0
	MOV r0,#2
	SWI XOS_Bit+SWI_OS_GBPB
	SUB r0,r2,r5
	LDMFD sp!,{r4,r5,pc}

lseek	MOV r3,r1	; offset in r3
	MOV r1,r0	; handle in r1
	CMP r2,#2
	BNE notend	; assume seek_set !
	MOV r0,#2
	SWI XOS_Bit+SWI_OS_Args
	ADD r3,r3,r2	; now offset from start in r3
notend	MOV r2,r3
	MOV r0,#1
	SWI XOS_Bit+SWI_OS_Args
	MOV pc,lr

getch	SWI XOS_Bit+SWI_OS_ReadC
	MOV pc,lr

access	STMFD sp!,{r4,r5,lr}
	MOV r1,r0		; assume access(...,0) i.e. does it exist?
	MOV r0,#17
	SWI XOS_Bit+SWI_OS_File
	CMP r0,#0
	MOVEQ r0,#1
	MOVNE r0,#0
	LDMFD sp!,{r4,r5,pc}

ro_flush_input
	MOV r0,#15
	MOV r1,#1
	SWI XOS_Bit+SWI_OS_Byte
	MOV pc,lr

ioc_t1	STMFD sp!,{r8,r9,lr}
        MOV R8,#0
        MOV R9,#21 ; HAL_CounterRead
        SWI XOS_Bit+SWI_OS_Hardware
          LDMVCFD sp!,{r8,r9,pc}

	SWI XOS_Bit+SWI_OS_EnterOS	; SVC mode to use IOC
	MOV r2,#&3200000	; IOC base
	STRB r2,[r2,#&5C]	; prepare for reading
	LDRB r1,[r2,#&50]	; read low byte
	LDRB r0,[r2,#&54]	; read high byte
	ADD r0,r1,r0,LSL#8	; total
	TEQP pc,#0		; return to USR mode
	MOV r0,r0		; no-op to settle down
	LDMFD sp!,{r8,r9,pc}

putch	SWI XOS_Bit+SWI_OS_WriteC
	MOV pc,lr

	END
